﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Collections.Generic;

    public partial class CtrlMenu : System.Web.UI.UserControl
    {
       // ACtual ---
       /// <summary>
       /// Evento asociado a la carga del propio controlador.
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            InicializaElementos();
            Resetea();
        }
        /// <summary>
        /// Metodo que asigna memoria a los componentes del controlador
        /// </summary>
        public void InicializaElementos()
        {
            _oculto = false;
            _porDefecto = true;

            _num_Efect_Opc = 0;
            if (_opciones == null)
            {
                _opciones = new List<String>();
            }
            // Referencia a la lista ul que se le habia dado ese id y la reconocia desde aqui con this.
            /*
            if (this.id_ListaOp_Din == null)
            {
               id_ListaOp_Din = new Table();
            } 
             */
            

        }
        /// <summary>
        /// Devuelve un elemento en una determinada posición
        /// </summary>
        /// <param name="indice"></param>
        /// <returns></returns>
        public String getOpcion(int indice)
        {
            return _opciones.ElementAt(indice);
        }
        /// <summary>
        /// Devuelve la lista completa de opciones
        /// </summary>
        /// <returns></returns>
        public List<String> getLista()
        {
            return _opciones;
        }
        /// <summary>
        /// Devolvemos el numero efectivo de opciones
        /// </summary>
        /// <returns></returns>
        public int getNumBotones()
        {
            return _num_Efect_Opc;
        }
        /// <summary>
        /// Metodo que indica si un entero se encuentra dentro del rango de botones disponibles
        /// </summary>
        /// <param name="indice"></param>
        /// <returns></returns>
        public bool perteneceRangoBotones(int indice)
        {
            return ((indice > -1) && (indice < _num_Efect_Opc));
        }
        /// <summary>
        /// Método de puesta a cero en el estado del controlador
        /// </summary>
        public void Resetea()
        {
            // Limpio la lista de opciones
            //Referencia a la lista ul que se le habia dado ese id y la reconocia desde aqui con this.
           // id_ListaOp_Din.Attributes.Clear();
            _num_Efect_Opc = NUM_OPCIONES;
            for (int i = 0; i < NUM_OPCIONES; i++)
            {
               // Referencia a la lista ul que se le habia dado ese id y la reconocia desde aqui con this.
               //this.id_ListaOp_Din.Attributes.Add((string)("Menu_" + i.ToString()), _opc_Defec[i].ToString());
            }
        }
        /// <summary>
        /// Metodo de actualización , redibujado , del controlador
        /// </summary>
        /// <returns></returns>
        public void Actualiza()
        {
            /*
             * 
             * try{} catch{ "problema al mostrar la lista ordenada"}
             */
            for (int i = 0; i < _num_Efect_Opc; i++)
            {
               // Referencia a la lista ul que se le habia dado ese id y la reconocia desde aqui con this.
               //this.id_ListaOp_Din.Attributes.Add((string)(i.ToString()), _opciones[i].ToString());
            }
            /*
            System.IO.TextWriter otro = new System.IO.TextWriter();
            otro.CreateObjRef( una);
            Html32TextWriter uno = new Html32TextWriter( otro );
            this.id_UL_listaOp.RenderControl(uno);
             * */
            // la idea es redibujar la pagina tras acutualizar la lista de opciones.
            //this.OnLoad(null);
            //this.Render(this._opciones);            
        }
       /// <summary>
       /// Metodo que obtiene el señador para un de los botones datos
       /// </summary>
       /// <param name="indice"></param>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       /// <returns></returns>
        public bool accedeABoton(int indice, object sender, EventArgs e)
        {
            return false;
           /*
           // reestricion necesaria ya que con la ocultacion del controlador este
           // oculto no ha de ser tampoco utilizable.
           if (! esta Oculto() askdhaskj
           if (perteneceRangoBotones(indice))
           {
               switch (indice) 
               {
                   case 0:
                       {
                           this.Button1_Click( sender,  e);
                           break;
                       }
                   case 1:
                       {
                           this.Button2_Click(sender, e);
                          //this.Button2.Click();
                           break;
                       }
                   case 2:
                       {
                           this.Button3_Click(sender, e);
                           break;
                       }
                   case 3:
                       {
                           this.Button4_Click(sender, e);
                           break;
                       }
                   case 4:
                       {
                           this.Button5_Click(sender, e);
                           break;
                       }
                   case 5:
                       {
                           this.Button6_Click(sender, e);
                           break;
                       }
               }
               return true;
           }
           return false;
            * */
        }
        /// <summary>
        /// Establece de forma dinamica el contenido de un boton del menu señalado con el indice. 
        /// Dicho boton se comprueba que esté en el rango valido antes de modificarse.
        /// </summary>
        /// <param name="indice"></param>
        /// <param name="caption"></param>
        public void setBoton(int indice, string caption)
        {
            if (perteneceRangoBotones(indice))
            {
                // Si la accion no existe previamente
                if (!_opciones.Contains(caption))
                {
                    _opciones.Add(caption);
                }
            }
            Actualiza();
        }
        /// <summary>
        /// Metodo que identifica la accion a realizar por el elemento del menu segun un string
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ProcesaAccionMenu(object sender, EventArgs e)
        {
            ;

        }
        /// <summary>
        /// Establecemos la lista de opciones disponibles para mostrar en el controlador
        /// Comforme avance la aplicación la opciones deberan de ser una clave valor con, Titulo de opcion y url 
        /// de respuesta asociada, rollo servlet total, salvo que haya algun metodo mejor en .net
        /// </summary>
        /// <param name="parametro"></param>
        /// <param name="numero"></param>
        public void setOpciones(List<String> parametro, int numero)
        {
            if (numero > -1)
            {
                _num_Efect_Opc = numero;
                for (int i = 0; i < _num_Efect_Opc; i++)
                {
                    if (!_opciones.Contains(parametro[i].ToString()))
                    {
                        _opciones.Add(parametro[i].ToString());
                    }
                }
            }
        }
        /// <summary>
        /// Getter que pregunta al controlador si el controlador esta ocultado o no.
        /// </summary>
        /// <returns></returns>
        public bool esPorDefecto()
        {
            return _porDefecto;
        }
        /// <summary>
        /// Setter que permite especificar si se ha hecho un tratamiento de el valor por defecto
        /// </summary>
        public void setEstaOculto(bool param)
        {
            _oculto = param;
        }
        /// <summary>
        /// Indica al controlador que el menu se encuentra oculto y ha de omitirse del resto de la pagina.
        /// </summary>
        public bool estaOculto()
        {
            return _oculto;
        }
        /// <summary>
        /// Indica al controlador que se trata de la pagina por defecto.
        /// </summary>
        /// <param name="param"></param>
        public void setEsPorDefecto(bool param)
        {
            _porDefecto = param;
        }

        private bool _oculto;
        private bool _porDefecto;
        // Número de opciones del menu por defecto
        private const int NUM_OPCIONES = 6;
        // Opciones por defecto
        private static String[] _opc_Defec = { "Login", "Mi Cuenta", "Agenda", "Actividades", "Productos", "Logout" };
        // Número de opciones efectiva
        private int _num_Efect_Opc;
        // Lista con las cadenas de la opciones
        private List<String> _opciones;
        //private fixed string _botones[NUM_BOTONES];
    }